package api

import (
	"admin100/app/model"
	"admin100/app/service"
	"admin100/library/define"
	"admin100/library/define/defErr"
	"admin100/library/response"
	"strings"

	"github.com/gogf/gf/net/ghttp"
	"github.com/gogf/gf/util/gconv"
)

var RoleMgr = roleMgrApi{}

type roleMgrApi struct{}

// @summary 角色列表_role_manager
// @tags    角色管理
// @produce json
// @param   page query int true "当前页数"
// @param   nums query int true "每页数据数量"
// @router  /role [GET]
// @success 200 {object} response.JsonResponse "执行结果"
func (a *roleMgrApi) Index(r *ghttp.Request) {

	var req *model.MyadminRoleListReq
	if err := r.Parse(&req); err != nil {
		response.JsonExitWithMsg(r, define.Fail, err.Error())
	}

	//分页显示用户列表
	pageInfo, data := service.Role.List(req.Page, req.Nums)
	if pageInfo.PNum < req.Page {
		response.JsonFail(r, define.PageOverPageLimit)
	}

	response.JsonSuc(r, map[string]interface{}{
		"total":   pageInfo.Total,
		"pageNum": pageInfo.PNum,
		"info":    data,
	})
}

// @summary 获取菜单列表
// @tags    角色管理
// @produce json
// @router  /role/menu-list [POST]
// @success 200 {object} response.JsonResponse "执行结果"
func (a *roleMgrApi) MenuList(r *ghttp.Request) {
	data := service.Menu.List()
	response.JsonSuc(r, data)
}

// @summary 添加角色
// @tags    角色管理
// @produce json
// @param   rolename formData  string true "角色名称"
// @router  /role/add [POST]
// @success 200 {object} response.JsonResponse "执行结果"
func (a *roleMgrApi) Add(r *ghttp.Request) {

	var req *model.MyadminRoleAddReq
	if err := r.ParseForm(&req); err != nil {
		response.JsonExitWithMsg(r, define.Fail, err.Error())
	}

	response.JsonSuc(r, service.Role.Add(req.Rolename))
}

// @summary 设置所属菜单
// @tags    角色管理
// @produce json
// @param   relId formData string true "关联菜单id字符串,例 22,44,55"
// @param   roleId formData int true "角色id"
// @router  /role/set-menu-rel [POST]
// @success 200 {object} response.JsonResponse "执行结果"
func (a *roleMgrApi) SetMenuRel(r *ghttp.Request) {
	var req model.MyadminRoleUserRelSet
	if err := r.ParseForm(&req); err != nil {
		response.JsonExitWithMsg(r, define.Fail, err.Error())
	}

	arrRelIds := strings.Split(req.RelId, ",")
	if len(arrRelIds) > 0 && len(arrRelIds[0]) == 0 {
		response.JsonSuc(r)
	}

	// 核对角色是否存在
	if has := service.Role.HasById(req.RoleId); !has {
		defErr.Panic(define.RoleNotExist)
	}

	/**
	* attention 与其消耗数据检测是否存在渠道，不如，默认相信前端传来的渠道号是都存在的
	* 如果要绝对安全，可以在使用的时候进行检测，而不是在这里
	 */
	response.JsonSuc(r, service.Role.UpdateMenuRel(arrRelIds, gconv.String(req.RoleId)))
}

// @summary 获取所属菜单
// @tags    角色管理
// @produce json
// @param   roleId query int true "角色id"
// @router  /role/fetch-menu-rel [GET]
// @success 200 {object} response.JsonResponse "执行结果"
func (a *roleMgrApi) FetchMenuRel(r *ghttp.Request) {
	var req model.MyadminRoleUserRelFetch
	if err := r.Parse(&req); err != nil {
		response.JsonExitWithMsg(r, define.Fail, err.Error())
	}

	// 核对角色是否存在
	if has := service.Role.HasById(req.RoleId); !has {
		defErr.Panic(define.RoleNotExist)
	}

	response.JsonSuc(r, service.Role.FetchMenuRelByRoleId(req.RoleId))
}

//todo 需要数据库所在表
func (a *roleMgrApi) SetChannelRel(r *ghttp.Request) {
	// @summary 设置所属渠道
	// @tags    角色管理
	// @produce json
	// @param   relCid formData string true "关联渠道id字符串,例 22,44,55"
	// @param   roleId formData int true "角色id"
	// @router  /role/set-channel-rel [POST]
	// @success 200 {object} response.JsonResponse "执行结果"
	var req model.MyadminRoleUserRelSet
	if err := r.ParseForm(&req); err != nil {
		response.JsonExitWithMsg(r, define.Fail, err.Error())
	}

	arrRelIds := strings.Split(req.RelId, ",")
	if len(arrRelIds) > 0 && len(arrRelIds[0]) == 0 {
		response.JsonSuc(r)
	}

	// 核对角色是否存在
	if has := service.Role.HasById(req.RoleId); !has {
		defErr.Panic(define.RoleNotExist)
	}

	/**
	* attention 与其消耗数据检测是否存在渠道，不如，默认相信前端传来的渠道号是都存在的
	* 如果要绝对安全，可以在使用的时候进行检测，而不是在这里
	 */
	response.JsonSuc(r, service.Role.UpdateChannelRel(arrRelIds, gconv.String(req.RoleId)))
}

//todo 需要数据库所在表
func (a *roleMgrApi) FetchChannelRel(r *ghttp.Request) {
	// @summary 获取所属渠道
	// @tags    角色管理
	// @produce json
	// @param   roleId query int true "角色id"
	// @router  /role/fetch-channel-rel [GET]
	// @success 200 {object} response.JsonResponse "执行结果"
	var req model.MyadminRoleUserRelFetch
	if err := r.Parse(&req); err != nil {
		response.JsonExitWithMsg(r, define.Fail, err.Error())
	}

	// 核对角色是否存在
	if has := service.Role.HasById(req.RoleId); !has {
		defErr.Panic(define.RoleNotExist)
	}

	response.JsonSuc(r, service.Role.FetchChannelRelByRoleId(req.RoleId))
}

// @summary 删除角色
// @tags    角色管理
// @produce json
// @param   roleId formData int true "角色id"
// @router  /role/del [POST]
// @success 200 {object} response.JsonResponse "执行结果"
func (a *roleMgrApi) Del(r *ghttp.Request) {
	var req model.MyadminRoleUserRelFetch
	if err := r.Parse(&req); err != nil {
		response.JsonExitWithMsg(r, define.Fail, err.Error())
	}
	// 核对角色是否存在
	if has := service.Role.HasById(req.RoleId); !has {
		defErr.Panic(define.RoleNotExist)
	}

	response.JsonSuc(r, service.Role.Del(req.RoleId))
}
